# encoding: utf-8
import sys,os,json,types,re
from time import sleep
from CollectSpider.service.task import  init_engine,update_status,update_schedule_flag
from scrapy.crawler import CrawlerProcess
from scrapy.conf import  settings
from CollectSpider.kancloud.PrintMsg import print_msg,unicode_to_str

#获取爬虫的列表
def get_spider_list():
    process=CrawlerProcess(settings)
    spider_loader=process.spider_loader
    return spider_loader.list()
      
    

#根据任务得到 开始路径 对应的爬虫名称
def get_key(urldict,start_url):
    if urldict is None and type(urldict)==types.DictType:
        raise ValueError("params error")
    else:
        key = urldict.keys()
        value = urldict.values()
        return key[value.index(start_url)]

#运行爬虫
def run_spider(task):
    if task is  None and not task["spider_urls"]:
        print_msg("任务id:%s  没有合适的爬虫，请设置好爬虫和开始路径，在启动")
    else:
        try:
            spider_urls=task["spider_urls"]
            process=CrawlerProcess(settings)
            for spider_url in spider_urls:
                for k,val in spider_url.items():
                    spider_task=make_run_spider_task(task, val)
                    process.crawl(k,**dict(spider_task))       
            process.start()
        except Exception,e:
            #异常处理
            print e

#
def make_run_spider_task(task,val):
    task["url_start"]=val 
    return task
    
#爬虫调度   
def spider_dispatch(task):
    if task is None and type(task)==types.DictType:
        raise ValueError("params error")
    else:
                #修改任务状态
        update_status(task,**dict({"pid":os.getpid()}))
        #同步数据库中 的任务状态
        task["task_status"]=1
        #根据键得到值
        spider_urls=task["spider_urls"]
        #检查任务类型 1 问答  2 是新闻
        task_type=int(task["task_type"]) #获取任务类型
        search_key=task["search_key"] #获取关键字
        spider_temp_urls=[]
        # 新闻类型,url_start 关键字替换
        for spider_url in spider_urls:
            for k,val in spider_url.iteritems():
                if k=='google_spider' and task_type==2:
                    val=re.sub('q=(\w+)',"q="+search_key,val) #构造百度 搜索路径
                    spider_temp_urls.append({k:val})
                elif k=='baidu_spider' and task_type==2:
                    val=re.sub('word=(\w+)',"word="+search_key,val) #构造google搜做的路径
                    spider_temp_urls.append({k:val})
                else:
                    spider_temp_urls.append({k:val})
        
                         
        task["spider_urls"]=spider_temp_urls
        #运行爬虫
#         print task     
#         exit(0)   
        run_spider(task)
        
        
def dispatch():
    try:
        params=sys.argv[1]
        print_msg("进入控制中心: %s" % params.encode("utf-8"))
        task=json.loads(params.encode("utf-8"))
        #根据开始路径，调度爬虫
        #如果是定天运行，就等待执行
        #类型为2  定天运行
        if(int(task["schedule_type"])==2):
            time_run=task["run_time"]
            #更改状态，为执行过
            update_schedule_flag(task, time_run)
            #任务启动时间超过了当前时间,不予执行
            spider_dispatch(task)   
        #类型为1  及时运行
        elif(int(task["schedule_type"])==1):
            #代表重复执行,的时间间隔，不标记 -1
            if int(task["time_interval"])>0:
                #重复执行间隔的时间
                sleep(int(task["time_interval"]))
                spider_dispatch(task)
            #代表执行单次，执行之后标记为 -1
            elif int(task["time_interval"])==0:
                spider_dispatch(task)
            else:
                print_msg("任务id:%s 调度方式为1 定时 任务 已经过时，不予执行" % unicode_to_str(task["id"]))
        
        exit(0)
    except Exception,e:
        print e
        exit(2)#参数有问题，没传过来
        
if __name__=="__main__":
    
    init_engine()  
    dispatch()

